﻿using System.Data.Common;
using DBA.Data.ADO;
using DBA.Data.Hibernate;

namespace DBA.Data
{
    /// <summary>
    /// 关于事务的处理
    /// </summary>
    public class ManagerTran
    {
        /// <summary>
        /// 数据访问函数库的实例，主要是想操作Connection
        /// </summary>
        private DataAccessLibrary dal;

        /// <summary>
        /// 用于事务处理
        /// </summary>
        private DbTransaction DbTran;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="dal">数据访问函数库的实例</param>
        public ManagerTran(DataAccessLibrary dal)
        {
            this.dal = dal;
        }

        //事务日志
        #region 事务处理部分。
        /// <summary>
        /// 打开连接，并且开始事务。
        /// </summary>
        public void TranBegin()
        {
            dal.Command.Connection.Open();		                //打开连接，直到回滚事务或者提交事务。
            DbTran = dal.Command.Connection.BeginTransaction();	//开始一个事务
            dal.Command.Transaction = DbTran;	                //交给Command
            dal.IsUseTrans = true;			                        //标记为启用事务

        }
        #endregion

        #region 提交事务，并关闭连接
        /// <summary>
        /// 提交事务，并关闭连接
        /// </summary>
        public void TranCommit()
        {
            if (dal.IsUseTrans)
            {
                //启用了事务
                DbTran.Commit();				    //提交事务
                dal.Command.Connection.Close();	//关闭连接
                dal.IsUseTrans = false;				//修改事务标志。
                DbTran.Dispose();
            }
            else
            {
                //没有启用事务，或者已经回滚，或者已经提交了事务
                DataAccessLibrary.AddLogError("误操作。在没有启用事务，或者已经回滚，或者已经提交了事务的情况下再次提交事务。请注意查看程序流程！");
            }

        }
        #endregion

        #region 回滚事务，并关闭连接。在程序出错的时候，自动调用。
        /// <summary>
        /// 回滚事务，并关闭连接。在程序出错的时候，自动调用。
        /// </summary>
        public void TranRollBack()
        {
            if (dal.IsUseTrans)
            {
                DbTran.Rollback();			        //回滚事务
                dal.Command.Connection.Close();	//关闭连接
                dal.IsUseTrans = false;				//修改事务标志。
                //DbTran.Dispose();
            }
            else
            {
                //没有启用事务，或者已经回滚，或者已经提交了事务
                DataAccessLibrary.AddLogError("误操作。在没有启用事务，或者已经回滚，或者已经提交了事务的情况下再次回滚事务。请注意查看程序流程！");
            }
        }
        #endregion
    }
}
